Hibernate এ interceptors এমন একটি মেকানিজম যা entity-এর insert, update, এবং delete অপারেশনগুলির আগে এবং পরে কাস্টম লজিক প্রয়োগ করতে সাহায্য করে। এই কাস্টম লজিকটি আপনি pre-insert, post-insert, pre-update, post-update, pre-delete, এবং post-delete মেথডের মাধ্যমে ব্যবহার করতে পারেন।
Hibernate-এ interceptor ব্যবহারের মাধ্যমে আপনি audit logs, entity validation, বা additional business logic সম্পাদন করতে পারেন যখন কোনো entity ডেটাবেসে insert, update, বা delete হয়।
Pre/Post Insert, Update, এবং Delete Interceptors এর ধারণা
- Pre-insert: কোনো entity insert করার আগে যে লজিকটি কার্যকরী হবে।
- Post-insert: entity insert করার পর যে লজিকটি কার্যকরী হবে।
- Pre-update: কোনো entity update করার আগে যে লজিকটি কার্যকরী হবে।
- Post-update: entity update করার পর যে লজিকটি কার্যকরী হবে।
- Pre-delete: কোনো entity delete করার আগে যে লজিকটি কার্যকরী হবে।
- Post-delete: entity delete করার পর যে লজিকটি কার্যকরী হবে।
Hibernate Interceptor Interface
Hibernate-এর Interceptor ইন্টারফেসটি ডেটাবেস অপারেশনগুলির আগে বা পরে কাস্টম প্রক্রিয়া চালানোর জন্য ব্যবহৃত হয়। Hibernate এর org.hibernate.Interceptor ইন্টারফেসে কয়েকটি মেথড রয়েছে যা entity-এর বিভিন্ন অবস্থায় হুক করা যায়।
এই ইন্টারফেসের মেথডগুলি হল:
onSave: Insert অপারেশন আগেonFlushDirty: Update অপারেশন আগেonDelete: Delete অপারেশন আগেpostFlush: Post-Flush (সেশন ক্লিয়ার করার পর)
Step-by-Step: Pre/Post Insert, Update, Delete Interceptors in Hibernate
এখানে একটি AuditInterceptor ক্লাস তৈরি করব যা entity insert, update, এবং delete করার আগে এবং পরে কিছু কাস্টম প্রক্রিয়া প্রয়োগ করবে।
Step 1: Interceptor ক্লাস তৈরি করা
import org.hibernate.*;
import org.hibernate.type.Type;
import java.io.Serializable;
public class AuditInterceptor implements Interceptor {
@Override
public boolean onSave(Object entity, Serializable id, Object[] state, String[] propertyNames, Type[] types) throws CallbackException {
// Pre-insert logic
if (entity instanceof Employee) {
System.out.println("Pre-insert: Employee is being inserted");
// You can add logic like setting created timestamp, audit data, etc.
}
return false; // Returning false allows Hibernate to proceed with the save operation.
}
@Override
public void onPostInsert(Object entity, Serializable id, Object[] state, String[] propertyNames, Type[] types) {
// Post-insert logic
if (entity instanceof Employee) {
System.out.println("Post-insert: Employee has been inserted");
}
}
@Override
public boolean onFlushDirty(Object entity, Serializable id, Object[] currentState, Object[] previousState, String[] propertyNames, Type[] types) throws CallbackException {
// Pre-update logic
if (entity instanceof Employee) {
System.out.println("Pre-update: Employee is being updated");
}
return false; // Returning false allows Hibernate to proceed with the update operation.
}
@Override
public void onPostUpdate(Object entity, Serializable id, Object[] state, String[] propertyNames, Type[] types) {
// Post-update logic
if (entity instanceof Employee) {
System.out.println("Post-update: Employee has been updated");
}
}
@Override
public boolean onDelete(Object entity, Serializable id, Object[] state, String[] propertyNames, Type[] types) throws CallbackException {
// Pre-delete logic
if (entity instanceof Employee) {
System.out.println("Pre-delete: Employee is being deleted");
}
return false; // Returning false allows Hibernate to proceed with the delete operation.
}
@Override
public void onPostDelete(Object entity, Serializable id, Object[] state, String[] propertyNames, Type[] types) {
// Post-delete logic
if (entity instanceof Employee) {
System.out.println("Post-delete: Employee has been deleted");
}
}
@Override
public void afterTransactionCompletion(Transaction tx) {
// After transaction completion logic
}
@Override
public void afterTransactionBegin(Transaction tx) {
// Logic after transaction begins
}
@Override
public void beforeTransactionCompletion(Transaction tx) {
// Logic before transaction completion
}
@Override
public boolean isTransactionInProgress() {
return false;
}
// Other unused methods can be overridden as needed
}
এখানে:
- onSave: এটি entity insert করার আগে কল করা হয়, যেখানে pre-insert লজিক স্থাপন করা হয়।
- onPostInsert: এটি insert সম্পন্ন হওয়ার পরে কল করা হয়, যেখানে post-insert লজিক স্থাপন করা হয়।
- onFlushDirty: এটি entity update করার আগে কল করা হয়, যেখানে pre-update লজিক স্থাপন করা হয়।
- onPostUpdate: এটি update সম্পন্ন হওয়ার পরে কল করা হয়, যেখানে post-update লজিক স্থাপন করা হয়।
- onDelete: এটি entity delete করার আগে কল করা হয়, যেখানে pre-delete লজিক স্থাপন করা হয়।
- onPostDelete: এটি delete সম্পন্ন হওয়ার পরে কল করা হয়, যেখানে post-delete লজিক স্থাপন করা হয়।
Step 2: Interceptor ব্যবহার করা
এখন আমাদের AuditInterceptor ব্যবহার করতে হবে যখন Hibernate সেশন তৈরি করি। নিচে একটি উদাহরণ দেখানো হয়েছে:
import org.hibernate.*;
import org.hibernate.cfg.Configuration;
public class HibernateInterceptorExample {
public static void main(String[] args) {
// Configure SessionFactory and enable interceptor
SessionFactory factory = new Configuration().configure("hibernate.cfg.xml")
.addAnnotatedClass(Employee.class)
.setInterceptor(new AuditInterceptor()) // Set the custom interceptor
.buildSessionFactory();
// Create session
Session session = factory.getCurrentSession();
try {
// Create a new Employee object
Employee employee = new Employee("John Doe", 50000);
// Start a transaction
session.beginTransaction();
// Save the Employee object (will trigger onSave and onPostInsert)
session.save(employee);
// Commit the transaction
session.getTransaction().commit();
// Update the Employee object (will trigger onFlushDirty and onPostUpdate)
session = factory.getCurrentSession();
session.beginTransaction();
employee.setSalary(60000);
session.update(employee);
session.getTransaction().commit();
// Delete the Employee object (will trigger onDelete and onPostDelete)
session = factory.getCurrentSession();
session.beginTransaction();
session.delete(employee);
session.getTransaction().commit();
} finally {
factory.close();
}
}
}
এখানে:
- Interceptor (
AuditInterceptor) Hibernate সেশনের সাথে যোগ করা হয়েছে এবং এর মাধ্যমে entity insert, update, এবং delete অপারেশনগুলির আগে ও পরে কাস্টম লজিক কার্যকর হচ্ছে। - Employee অবজেক্টের
save(),update(), এবংdelete()মেথডগুলির মাধ্যমে বিভিন্ন CRUD অপারেশন চালানো হয় এবং এই অপারেশনগুলির আগে এবং পরে interceptor কাস্টম লজিক চালাচ্ছে।
Interceptor এর সুবিধা
| ফিচার | বিবরণ |
|---|---|
| Custom Logic | Insert, update, delete অপারেশনগুলির আগে এবং পরে কাস্টম লজিক কার্যকর করা যায়। |
| Audit Log | Entity অপারেশনগুলির ইতিহাস রেকর্ড করা যেতে পারে। |
| Entity Validation | Entity আপডেট বা ডিলিট করার আগে কাস্টম ভ্যালিডেশন করা যায়। |
| Data Integrity | ডেটাবেসের উপর অতিরিক্ত নিয়ন্ত্রণ স্থাপন করা যায়, যেমন entity-এর অবস্থা চেক করা। |
Hibernate এর Pre/Post Insert, Update, এবং Delete Interceptors আপনাকে entity ডেটাবেস অপারেশনগুলির আগে এবং পরে কাস্টম প্রক্রিয়া চালানোর সুযোগ দেয়। এই ধরনের interceptors ব্যবহার করে আপনি audit logs, entity validation, business logic, বা data integrity checks চালাতে পারেন। Hibernate-এ interceptors ব্যবহারে কোড আরও নমনীয় এবং কার্যকরী হয়।
Read more